var fs = require('fs');
var path = require('path');
 
/**
 * 遍历指定目录下文件信息
 * @param obj{
 *    dir: string // 遍历目录
 *    callback: function // 每次读取文件后的回调
 *    finish: function // 遍历结束后的回调
 * }  
 */
function displayFilesInfo(obj) {
  // 读取目录
  fs.readdir(obj.dir, function (err, files) {
    if(err === null){
      (function next(i) {
        // 判断读取是否完成
        if(i < files.length) {
          var filedir = path.join(obj.dir, files[i]);
          // 获取状态
          fs.stat(filedir, function (err, stats) {
            // 继续读取子目录
            if(stats.isDirectory()){
              displayFilesInfo({
                dir:filedir,
                callback:obj.callback,
                finish:function () {
                  next(i + 1)
                }
              })
            }else {
              // 回调返回文件信息
              var fileObj = {
                path: filedir,
                stat: stats
              }
              obj.callback(err, fileObj, function () {
                next(i + 1)
              })
            }
          })
        }else {
          // 结束回调
          obj.finish()
        }
      })(0)
    }else {
      obj.callback(err)
    }
  })
}

// 依据遍历信息函数获取文件总大小
function getFilesizeFromPath(filePath,cb){
  var statAry = [];
  displayFilesInfo({
    dir: filePath,
    callback: function (err, obj, next){
      if(err !== null){
        console.log('遍历错误', err)
        return;
      }
      statAry.push(obj);
      next();
    },
    finish: function(){
      var filesSize = statAry.reduce(function(prev, cur){
        return prev+cur.stat.size
      },0)
      cb(filesSize)
    }
  })
}

// 使用示例
var filePath = path.resolve('E:/lg/lg_lesson17/notes/code/net');
getFilesizeFromPath(filePath, function(size){
  console.log('文件总大小为'+(size/1024).toFixed(2)+'kb')
})
